﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Core.Message.Entities;
using Core.Controls.Message;
using Core.ExceptionHandling;
using Core.Common.Session;
using vHCS.TS.Business;
using vHCS.HR.Business;
using vHCS.HR.Entities;
using vHCS.SYS.Business;
using vHCS.LS.Business;
using vHCS.LS.Entities;
using Telerik.Web.UI;
using System.Configuration;

namespace vHCS.K2App.MdlK2
{
    /// <summary>
    /// Đăng ký nghỉ online
    /// </summary>
    public partial class TS_LeaveRequestList : Core.NTier.UserInterface.BaseFormNotPer
    {
        /// <summary>
        /// Khai báo biến
        /// </summary>
        private const string _LIST_PAGE = "TS_LeaveList.aspx";
        private const string _MY_PAGE = "TS_LeaveRequestList.aspx";
        private const string _APPLICATIONID = "ApplicationLeaveID";
        private const string _LEAVERECORDID = "LeaveRecordID";
        private const long _SAVE = 1; // chưa gửi
        private const long _SUBMIT = 2; // đã gửi

        /// <summary>
        /// page load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                dtpCurrentDate.SelectedDate = DateTime.Now.Date;
                hStatusEdit.Value = "0";
                chkDetail.Checked = false; // mặc định = false
                if (!Page.IsPostBack)
                {
                    //Hiển thị thông tin user hiện tại                
                    this.ucEmpHeader.LoadEmpInfo(SessionManager.UserDomain);
                    
                    // lấy thông tin EmpID nhân viên
                    SYS_UsersCollection col = new SYS_UsersCollection();
                    SYS_UsersBL bl = col.FindById_BL(SessionManager.UserDomain);

                    this.hEmpID.Value = bl.EmployeeId.ToString();

                    // check nhân viên được gán vào lịch làm việc chưa?
                    TS_LeaveRecordCollection col1 = new TS_LeaveRecordCollection();
                    long lgnEmpID = 0;
                    long.TryParse(this.hEmpID.Value, out lgnEmpID);
                    if (!col1.CheckEffectSchedule(lgnEmpID))
                        MessageBox.ShowByMessCode("10161", MessageType.Warning);

                    //-------------- lấy kết quả request
                    // ID đơn nghỉ
                    long lngApplicationID = 0;
                    long.TryParse(Request.QueryString[_APPLICATIONID], out lngApplicationID);
                    this.hApplicationLeaveID.Value = lngApplicationID.ToString();
                    // ID phiếu nghỉ
                    long lngLeaveRecordID = 0;
                    long.TryParse(Request.QueryString[_LEAVERECORDID], out lngLeaveRecordID);
                    this.hLeaveRecordID.Value = lngLeaveRecordID.ToString();

                    // trường hợp chưa tạo đơn nghỉ thì set enabled = false nút Gửi duyệt
                    if (string.IsNullOrEmpty(hApplicationLeaveID.Value.ToString()) || hApplicationLeaveID.Value == "0")
                    {
                        btnSubmitTop.Enabled = false;
                        btnSubmitBot.Enabled = false;
                    }
                    else
                    {
                        btnSubmitTop.Enabled = true;
                        btnSubmitBot.Enabled = true;
                    }

                    hStatusEdit.Value = "1";
                    LoadInfoLeaveRecord(lngLeaveRecordID);   // load chi tiet thong tin phieu nghi                 

                    // add [21/11/2011]: tạm thời rem các xử lý khác, chỉ để thao tác lưu&gửi duyệt thôi
                    //default thể hiện loại nghỉ = phép năm
                    DataTable dtAL = new DataTable();
                    dtAL = col1.GetWorkPointID_AnualLeave(ucEmpHeader.EmployeeId);
                    //this.cboWorkPoint.SelectedValue = dtAL.Rows[0]["LSWorkPointID"].ToString();
                    SetComboValue(cboWorkPoint, dtAL.Rows[0]["LSWorkPointID"].ToString(), true);
                    this.cboWorkPoint_SelectedIndexChanged(null, null);
                    btnCreateTop.Visible = false;
                    btnCreateBot.Visible = false;

                    btnSubmitTop.Visible = false;
                    btnSubmitBot.Visible = false;
                    // end add [21/11/2011]

                    ClientScript.RegisterStartupScript(Page.GetType(), "LoadMaximize", "LoadMaximize();", true);

                    rttFromDate.TargetControlID = dtpFromDate.ClientID + "_dateInput_wrapper";
                    rttToDate.TargetControlID = dtpToDate.ClientID + "_dateInput_wrapper";
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút lưu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                #region DungN2 bổ sung
                //gán thông tin fromdate, todate để xử lý gửi mail
                dtpHideFromDate.SelectedDate = dtpFromDate.SelectedDate;
                dtpHideToDate.SelectedDate = dtpToDate.SelectedDate;
                hdfLeaveTaken.Value = (float.Parse(string.IsNullOrEmpty(txtLeaveTaken.Text.Trim()) ? "0" : txtLeaveTaken.Text.Trim().Replace(",", ".")) - float.Parse(string.IsNullOrEmpty(hdfLeaveTaken_K2.Value.Trim()) ? "0" : hdfLeaveTaken_K2.Value.Trim())).ToString();
                txtWorkPoint.Text = cboWorkPoint.SelectedValue;
                #endregion

                //Kiểm tra có thông tin chi tiết phiếu nghỉ ko?
                if (dtgDetail.Items == null || dtgDetail.Items.Count == 0)
                {
                    MessageBox.ShowByMessCode("10163", MessageType.Warning);
                    return;
                }

                TS_LeaveRecordBL bl = new TS_LeaveRecordBL();
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();

                // ID phiếu nghỉ
                long lngLeaveID = 0;
                long.TryParse(this.hLeaveRecordID.Value, out lngLeaveID);

                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(this.hEmpID.Value, out lngEmpID);

                // ID đơn nghỉ
                long lngApplicationID = 0;
                long.TryParse(this.hApplicationLeaveID.Value, out lngApplicationID);

                // ID loại nghỉ
                long lngWorkPointID = 0;
                long.TryParse(this.cboWorkPoint.SelectedValue, out lngWorkPointID);

                // đưa các thông tin phiếu nghỉ vào objBL
                bl.LeaveRecordID = lngLeaveID;
                bl.EmpID = lngEmpID;
                bl.LSWorkPointID = lngWorkPointID;
                bl.FromDate = Convert.ToDateTime(this.dtpFromDate.SelectedDate);
                bl.ToDate = Convert.ToDateTime(this.dtpToDate.SelectedDate);
                bl.LeaveTaken = this.txtLeaveTaken.Text;
                bl.Note = this.txtReason.Text;
                bl.Comment = this.txtComment.Text;
                bl.ApplicationLeaveID = lngApplicationID;
                bl.LeaveStatusID = _SAVE;

                // thông tin chi tiết phiếu nghỉ
                char splitChar = ',';
                string strDate = "", Date = "";
                string strShift = "", Shift = "";
                string strAll = "", strHead = "", strLast = "";
                float sumLeaveTaken = 0;
                bool InValid = true;
                foreach (GridDataItem item in dtgDetail.Items)
                {
                    Date = item["DateV"].Text.ToString();
                    Shift = item["LSShiftID"].Text.ToString();
                    CheckBox chkAll = (CheckBox)item.FindControl("chkAll");
                    CheckBox chkHead = (CheckBox)item.FindControl("chkHead");
                    CheckBox chkLast = (CheckBox)item.FindControl("chkLast");
                    strDate += Date + splitChar;
                    strShift += Shift + splitChar;
                    strAll += (chkAll.Checked ? "1" : "0") + splitChar;
                    strHead += (chkHead.Checked ? "1" : "0") + splitChar;
                    strLast += (chkLast.Checked ? "1" : "0") + splitChar;

                    // tính lại leavetaken trong trường hợp người dùng hiệu chỉnh chi tiết phiếu nghỉ
                    if (chkHead.Checked) sumLeaveTaken += (float)0.5;
                    if (chkLast.Checked) sumLeaveTaken += (float)0.5;

                    if (chkHead.Checked == false && chkLast.Checked == false)
                    {
                        InValid = false;
                    }
                }

                if (sumLeaveTaken == 0) // ko có thông tin chi tiết phiếu nghỉ
                {
                    MessageBox.ShowByMessCode("10163", MessageType.Warning);
                    return;
                }
                // rem doan nay theo yeu cau cua VNG, co the nhap nghi xen ke, ko nhat nhiet ngay phai bat buoc nghi
                /*else if (InValid == false && sumLeaveTaken > 0) // phải bắt buộc chọn ít nhất 1/2 ngày ở các ngày đăng ký nghỉ
                {
                    MessageBox.ShowByMessCode("12318", MessageType.Error);
                    return;
                }*/

                // kiểm tra thông tin phiếu nghỉ trước khi lưu dữ liệu
                int result = col.CheckLeave(bl.EmpID, bl.FromDate, bl.ToDate, sumLeaveTaken.ToString(), bl.LSWorkPointID, bl.LeaveRecordID, bl.ApplicationLeaveID, strDate, strAll, strHead, strLast, splitChar);
                if (result == 0) // phiếu nghỉ hợp lệ
                {
                    // gọi hàm lưu dữ liệu
                    long lgnApplicationID = 0; // ID đơn nghỉ
                    lgnApplicationID = col.SaveLeave(bl, strDate, strShift, strAll, strHead, strLast, splitChar, "");

                    this.hApplicationLeaveID.Value = lgnApplicationID.ToString();

                    pnlValidate.Visible = false;
                    // thông báo lưu thành công
                    MessageBox.ShowByMessCode("10162", MessageType.Successful);

                    btnSubmitTop.Enabled = true;
                    btnSubmitBot.Enabled = true;

                    btnAddNew_Click(null, null);
                    return;
                }
                else
                {
                    chkDetail.Checked = true;
                }

                if (result == 1) // thời gian nghỉ bị chồng chéo
                    MessageBox.ShowByMessCode("10251", MessageType.Error);

                else if (result == 2) // nghỉ vượt số ngày qui định
                    MessageBox.ShowByMessCode("10252", MessageType.Error);

                else if (result == 3) // ko trùng loại nghỉ trong đơn nghỉ
                    MessageBox.ShowByMessCode("10254", MessageType.Error);

                else if (result == 4) // thời gian của các phiếu nghỉ ko liên tục
                    MessageBox.ShowByMessCode("10255", MessageType.Error);

                else if (result == 5) // năm của từ ngày = năm của đến ngày đối với loại nghỉ phép và nghỉ bù
                    MessageBox.ShowByMessCode("10256", MessageType.Error);

                else if (result == 6) // ngày nghỉ phải lớn hơn ngày vào cty
                    MessageBox.ShowByMessCode("10259", MessageType.Error);

                else if (result == 7) // ngày nghỉ phải nhỏ hơn ngày thôi việc
                {
                    // lấy thông tin ngày thôi việc của nhân viên
                    TER_TerminationCollection colTer = new TER_TerminationCollection();
                    TER_TerminationDTO dtoTer = new TER_TerminationDTO();
                    dtoTer = colTer.SelectById(bl.EmpID);

                    BusinessLogicCustomException ex = new BusinessLogicCustomException("10260"); // thông báo
                    ex.AdditionInfo = new String[] { dtoTer.EffectivelDate.ToShortDateString() };
                    throw ex;
                    return;
                    //MessageBox.ShowByMessCode("10260", MessageType.Error);
                }

                else if (result == 8) // ko được nhập phép nghỉ phép khi còn phép nghỉ bù
                    MessageBox.ShowByMessCode("10261", MessageType.Error);

                else if (result == 9) // kiểm tra chọn nhân viên
                    MessageBox.ShowByMessCode("10262", MessageType.Error);

                else if (result == 10) // nghỉ thai sản vượt số tháng qui định
                    MessageBox.ShowByMessCode("12323", MessageType.Error);

                else if (result == 13) // đã có thông tin dồn phép/bù, ko được hiệu chỉnh nghỉ
                    MessageBox.ShowByMessCode("12453", MessageType.Error);

                else if (result == 14) // thông tin nghỉ đã được dùng để tổng hợp công
                    MessageBox.ShowByMessCode("12454", MessageType.Error);
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút lưu & gửi duyệt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSaveSubmit_Click(object sender, EventArgs e)
        {
            try
            {
                #region DungN2 bổ sung
                //gán thông tin fromdate, todate để xử lý gửi mail
                
                dtpHideFromDate.SelectedDate = dtpFromDate.SelectedDate;
                dtpHideToDate.SelectedDate = dtpToDate.SelectedDate;
                float a = TS_clsCommon.ConvertFromStringToFloat(txtLeaveTaken.Text.ToString());
                hdfLeaveTaken.Value = (TS_clsCommon.ConvertFromStringToFloat(txtLeaveTaken.Text.Trim()) -
                    TS_clsCommon.ConvertFromStringToFloat(hdfLeaveTaken_K2.Value.Trim())).ToString();
                txtWorkPoint.Text = cboWorkPoint.SelectedValue;
                #endregion

                TS_LeaveRecordCollection collection = new TS_LeaveRecordCollection();
                //Kiểm tra có thông tin chi tiết phiếu nghỉ ko?
                if (dtgDetail.Items == null || dtgDetail.Items.Count == 0)
                {
                    MessageBox.ShowByMessCode("10163", MessageType.Warning);
                    return;
                }

                TS_LeaveRecordBL bl = new TS_LeaveRecordBL();
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();

                // ID phiếu nghỉ
                long lngLeaveID = 0;
                long.TryParse(this.hLeaveRecordID.Value, out lngLeaveID);

                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(this.hEmpID.Value, out lngEmpID);

                // ID đơn nghỉ
                long lngApplicationID = 0;
                long.TryParse(this.hApplicationLeaveID.Value, out lngApplicationID);

                // ID loại nghỉ
                long lngWorkPointID = 0;
                long.TryParse(this.cboWorkPoint.SelectedValue, out lngWorkPointID);

                // đưa các thông tin phiếu nghỉ vào objBL
                bl.LeaveRecordID = lngLeaveID;
                bl.EmpID = lngEmpID;
                bl.LSWorkPointID = lngWorkPointID;
                bl.FromDate = Convert.ToDateTime(this.dtpFromDate.SelectedDate);
                bl.ToDate = Convert.ToDateTime(this.dtpToDate.SelectedDate);
                bl.LeaveTaken = this.txtLeaveTaken.Text;
                bl.Note = this.txtReason.Text;
                bl.Comment = this.txtComment.Text;
                bl.ApplicationLeaveID = lngApplicationID;
                bl.LeaveStatusID = _SAVE;

                // thông tin chi tiết phiếu nghỉ
                char splitChar = ',';
                string strDate = "", Date = "";
                string strShift = "", Shift = "";
                string strAll = "", strHead = "", strLast = "";
                float sumLeaveTaken = 0;
                bool InValid = true;
                foreach (GridDataItem item in dtgDetail.Items)
                {
                    Date = item["DateV"].Text.ToString();
                    Shift = item["LSShiftID"].Text.ToString();
                    CheckBox chkAll = (CheckBox)item.FindControl("chkAll");
                    CheckBox chkHead = (CheckBox)item.FindControl("chkHead");
                    CheckBox chkLast = (CheckBox)item.FindControl("chkLast");
                    strDate += Date + splitChar;
                    strShift += Shift + splitChar;
                    strAll += (chkAll.Checked ? "1" : "0") + splitChar;
                    strHead += (chkHead.Checked ? "1" : "0") + splitChar;
                    strLast += (chkLast.Checked ? "1" : "0") + splitChar;

                    // tính lại leavetaken trong trường hợp người dùng hiệu chỉnh chi tiết phiếu nghỉ
                    if (chkHead.Checked) sumLeaveTaken += (float)0.5;
                    if (chkLast.Checked) sumLeaveTaken += (float)0.5;

                    if (chkHead.Checked == false && chkLast.Checked == false)
                    {
                        InValid = false;
                    }
                }

                if (sumLeaveTaken == 0) // ko có thông tin chi tiết phiếu nghỉ
                {
                    MessageBox.ShowByMessCode("10163", MessageType.Warning);
                    return;
                }
                else if (InValid == false && sumLeaveTaken > 0) // phải bắt buộc chọn ít nhất 1/2 ngày ở các ngày đăng ký nghỉ
                {
                    MessageBox.ShowByMessCode("12318", MessageType.Error);
                    return;
                }

                // kiểm tra thông tin phiếu nghỉ trước khi lưu dữ liệu
                int result = col.CheckLeave(bl.EmpID, bl.FromDate, bl.ToDate, sumLeaveTaken.ToString(), bl.LSWorkPointID, bl.LeaveRecordID, bl.ApplicationLeaveID, strDate, strAll, strHead, strLast, splitChar);
                if (result == 0) // phiếu nghỉ hợp lệ
                {
                    // gọi hàm lưu dữ liệu
                    long lgnApplicationID = 0; // ID đơn nghỉ
                    lgnApplicationID = col.SaveLeave(bl, strDate, strShift, strAll, strHead, strLast, splitChar, "");

                    this.hApplicationLeaveID.Value = lgnApplicationID.ToString();

                    // lưu thành công thì gửi duyệt
                    long AppID = lgnApplicationID;

                    //btnSave_Click(null, null);

                    if (AppID > 0)
                    {
                        long[] arr_ID = new long[1];
                        arr_ID[0] = AppID;
                        if (arr_ID.Length > 0)
                        {
                            collection.UpdateProcessByList(arr_ID, _SUBMIT);

                            // thông báo lưu & gửi duyệt thành công
                            MessageBox.ShowByMessCode("12587", MessageType.Successful);

                            setEnabledButton(false);
                        }

                        #region Xử lý trong K2
                        K2Collection colK2 = new K2Collection();
                        //HR_WorkingRecordBL bl_wr = new HR_WorkingRecordBL();
                        HR_WorkingRecordCollection cl_wr = new HR_WorkingRecordCollection();
                        HIE_EmpInHierarchyCollection cl_emphie = new HIE_EmpInHierarchyCollection();
                        SYS_MailTemplateCollection cl_mail = new SYS_MailTemplateCollection();
                        //bl_wr = cl_wr.SelectLastWRByEmpID_ForFormWR(ucEmpHeader.EmployeeId);
                        //string sReportingLine = "";
                        //if (bl_wr.DTO != null)
                        //    sReportingLine = bl_wr.ReportingLine;

                        string sFromDate = Convert.ToDateTime(dtpHideFromDate.SelectedDate).ToShortDateString();
                        string sToDate = Convert.ToDateTime(dtpHideToDate.SelectedDate).ToShortDateString();
                        string sRequester = SessionManager.UserDomain;

                        #region Xử lý gửi mail cho requester
                        //string MailRequester_Subject = cl_mail.ReturnSubjectMail("TS_Creator");
                        //string MailRequester_Content = cl_mail.ReturnMailContent("TS_Creator");
                        //MailRequester_Content = MailRequester_Content.Replace("$FromDate$", sFromDate);
                        //MailRequester_Content = MailRequester_Content.Replace("$ToDate$", sToDate);
                        //MailRequester_Content = MailRequester_Content.Replace("$TotalDay$", txtLeaveTaken.Text.Trim());
                        //MailRequester_Content = MailRequester_Content.Replace("$Approver$", sReportingLine);
                        //MailRequester_Content = MailRequester_Content.Replace("$url$", ConfigurationManager.AppSettings.Get("LinkLeaveList"));

                        //string EmailRequester = cl_mail.ReturnEmail(SessionManager.UserDomain);
                        #endregion

                        #region Xử lý gửi email cho Admin
                        //string MailAdmin_Subject = cl_mail.ReturnSubjectMail("TS_CreatorForAdmin");
                        //string MailAdmin_Content = cl_mail.ReturnMailContent("TS_CreatorForAdmin");
                        //long hierarchy = cl_emphie.SelectDeptHie(bl_wr.HierarchyId);
                        //HR.Business.HIE_HierarchyCollection cl_hie = new HR.Business.HIE_HierarchyCollection();
                        //HR.Business.HIE_HierarchyBL bl_hie = new HR.Business.HIE_HierarchyBL();
                        //bl_hie = cl_hie.SelectByID(hierarchy);
                        //if (bl_hie.DTO != null)
                        //{
                        //    MailAdmin_Subject = MailAdmin_Subject.Replace("$Dept$", bl_hie.NameVN);
                        //}

                        //MailAdmin_Subject = MailAdmin_Subject.Replace("$AccountDomain$", SessionManager.UserDomain);
                        //MailAdmin_Content = MailAdmin_Content.Replace("$EmpCode$", ucEmpHeader.EmpCode);
                        //MailAdmin_Content = MailAdmin_Content.Replace("$FullName$", ucEmpHeader.FullName);
                        //MailAdmin_Content = MailAdmin_Content.Replace("$FromDate$", sFromDate);
                        //MailAdmin_Content = MailAdmin_Content.Replace("$ToDate$", sToDate);
                        //MailAdmin_Content = MailAdmin_Content.Replace("$TotalDay$", txtLeaveTaken.Text.Trim());


                        //LS_WorkPointDTO bl_wp = new LS_WorkPointDTO();
                        //LS_WorkPointCollection cl_wp = new LS_WorkPointCollection();
                        //bl_wp = cl_wp.GetbyId(Convert.ToInt64(txtWorkPoint.Text.Trim()));
                        //if (bl_wp != null)
                        //    MailAdmin_Content = MailAdmin_Content.Replace("$LeaveType$", bl_wp.NameVN);

                        //string sEmailAdmin = cl_mail.ReturnEmail(colK2.GetUserOfCB());
                        #endregion

                        #region Xử lý gửi mail Next Approver
                        //string sMailNextApprover_Subject = cl_mail.ReturnSubjectMail("TS_NextApprover");
                        //string sMailNextApprover_Content = cl_mail.ReturnMailContent("TS_NextApprover");
                        ////Gán thông tin vào Subject
                        //sMailNextApprover_Subject = sMailNextApprover_Subject.Replace("$Creator$", SessionManager.UserDomain);
                        ////Gán thông tin vào content
                        //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$Creator$", SessionManager.UserDomain);
                        //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$FromDate$", sFromDate);
                        //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$ToDate$", sToDate);
                        //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$TotalDay$", txtLeaveTaken.Text.Trim());
                        //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$url$", ConfigurationManager.AppSettings.Get("LinkLeaveApprove_Old"));

                        //string sMailReportingLine = cl_mail.ReturnEmail(sReportingLine);
                        #endregion

                        //if (!string.IsNullOrEmpty(sReportingLine))
                        //{
                        dtgList.DataBind();

                        int iTypeID = K2CoreLib.K2Utils.GetTypeIDProcessFromEfrom("HR_LeaveRequest");
                        string sLinkContent = ConfigurationManager.AppSettings.Get("History_LeaveRequest") + AppID.ToString() + "&LeaveRecordID=" + dtgList.Items[0]["LeaveRecordID"].Text.Trim() + "&EmpID=" + ucEmpHeader.EmployeeId.ToString();
                        string approveLink = ConfigurationManager.AppSettings.Get("LinkLeaveApprove_Old");
                        string viewHistoryLink = sLinkContent;
                        string totalDay = txtLeaveTaken.Text.Trim();
                        string status = "0"; //(0: In process, 1: Complete, 2: Rework, 3:Reject)
                        string eformid = K2CoreLib.K2Utils.submit2EForm(SessionManager.UserDomain, SessionManager.UserDomain, iTypeID, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), sLinkContent, status,ucEmpHeader.Username);
                        string[] lst_eformid = eformid.Split(',');

                        //Get expire day
                        string ExpireDay = ConfigurationManager.AppSettings.Get("LEAVE_ExpireDay");
                        string ExpireAlert = ConfigurationManager.AppSettings.Get("LEAVE_ExpireAlert");

                        int proid = K2CoreLib.K2Utils.StartLeaveRequestProcess(ucEmpHeader.EmployeeId.ToString(), TS_clsCommon.ConvertFromStringToFloat(hdfLeaveTaken.Value.Trim()), dtgList.Items[0]["LeaveRecordID"].Text.Trim(), AppID.ToString(),
                                                                                sRequester, sFromDate, sToDate, lst_eformid[1], lst_eformid[0], approveLink, viewHistoryLink, totalDay,"",ucEmpHeader.Username,ExpireDay,ExpireAlert);
                        K2CoreLib.K2Utils.Update2EForm("0", lst_eformid[1], proid.ToString());
                        collection.UpdateProcessId(AppID, lst_eformid[1]);
                        #region begin to save history
                        cl_wr.InsertHistory(Convert.ToInt64(AppID.ToString()), DateTime.Now, SessionManager.Username, "Requester", "Submitted", "", 4,0);
                        #endregion End save
                        //}
                        #endregion
                    }

                    pnlValidate.Visible = false;

                    btnAddNew_Click(null, null);

                    ClientScript.RegisterStartupScript(Page.GetType(), "ClosePage", "ClosePage();", true);
                    return;
                }
                else
                {
                    chkDetail.Checked = true;
                }

                if (result == 1) // thời gian nghỉ bị chồng chéo
                    MessageBox.ShowByMessCode("10251", MessageType.Error);

                else if (result == 2) // nghỉ vượt số ngày qui định
                    MessageBox.ShowByMessCode("10252", MessageType.Error);

                else if (result == 3) // ko trùng loại nghỉ trong đơn nghỉ
                    MessageBox.ShowByMessCode("10254", MessageType.Error);

                else if (result == 4) // thời gian của các phiếu nghỉ ko liên tục
                    MessageBox.ShowByMessCode("10255", MessageType.Error);

                else if (result == 5) // năm của từ ngày = năm của đến ngày đối với loại nghỉ phép và nghỉ bù
                    MessageBox.ShowByMessCode("10256", MessageType.Error);

                else if (result == 6) // ngày nghỉ phải lớn hơn ngày vào cty
                    MessageBox.ShowByMessCode("10259", MessageType.Error);

                else if (result == 7) // ngày nghỉ phải nhỏ hơn ngày thôi việc
                {
                    // lấy thông tin ngày thôi việc của nhân viên
                    TER_TerminationCollection colTer = new TER_TerminationCollection();
                    TER_TerminationDTO dtoTer = new TER_TerminationDTO();
                    dtoTer = colTer.SelectById(bl.EmpID);

                    BusinessLogicCustomException ex = new BusinessLogicCustomException("10260"); // thông báo
                    ex.AdditionInfo = new String[] { dtoTer.EffectivelDate.ToShortDateString() };
                    throw ex;
                    return;
                    //MessageBox.ShowByMessCode("10260", MessageType.Error);
                }

                else if (result == 8) // ko được nhập phép nghỉ phép khi còn phép nghỉ bù
                    MessageBox.ShowByMessCode("10261", MessageType.Error);

                else if (result == 9) // kiểm tra chọn nhân viên
                    MessageBox.ShowByMessCode("10262", MessageType.Error);

                else if (result == 10) // nghỉ thai sản vượt số tháng qui định
                    MessageBox.ShowByMessCode("12323", MessageType.Error);

                else if (result == 13) // đã có thông tin dồn phép/bù, ko được hiệu chỉnh nghỉ
                    MessageBox.ShowByMessCode("12453", MessageType.Error);

                else if (result == 14) // thông tin nghỉ đã được dùng để tổng hợp công
                    MessageBox.ShowByMessCode("12454", MessageType.Error);

                
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút xóa phiếu nghỉ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                //Kiểm tra check chọn
                if (dtgList.SelectedItems == null || dtgList.SelectedItems.Count == 0)
                    MessageBox.ShowByMessCode("10003", MessageType.Warning);

                bool IsOne = false;
                if (dtgList.Items.Count == 1)
                    IsOne = true;

                // duyệt từng dòng check chọn trên lưới
                long[] arr_ID = new long[dtgList.SelectedItems.Count];
                for (int i = 0; i < dtgList.SelectedItems.Count; i++)
                {
                    GridDataItem item = (GridDataItem)dtgList.SelectedItems[i];
                    string strID = item["LeaveRecordID"].Text.ToString().Trim();
                    long lngID = long.Parse(string.IsNullOrEmpty(strID) ? "0" : strID);
                    arr_ID[i] = lngID;
                }

                // thực hiện thao tác xóa                
                if (arr_ID.Length > 0)
                {
                    TS_LeaveRecordCollection collection = new TS_LeaveRecordCollection();
                    collection.DeleteByList(arr_ID);

                    // thông báo xóa thành công
                    MessageBox.ShowByMessCode("10001", MessageType.Successful);

                    btnAddNew_Click(null, null);

                    if (IsOne == true)
                    {
                        btnSubmitTop.Enabled = false;
                        btnSubmitBot.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút danh sách
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnList_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(_LIST_PAGE);
        }

        /// <summary>
        /// sự kiện click nút tạo đơn nghỉ mới
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnCreate_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(_MY_PAGE);
        }

        /// <summary>
        /// sự kiện click nút thêm mới
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAddNew_Click(object sender, EventArgs e)
        {
            cboWorkPoint.SelectedIndex = 0;
            cboWorkPoint.Text = "";
            txtRemainLeave.Text = "";
            txtComment.Text = "";
            txtLeaveTaken.Text = "";
            txtReason.Text = "";
            dtpFromDate.Clear();
            dtpToDate.Clear();
            this.hLeaveRecordID.Value = "";
            txtYearsDay.Text = "";
            txtYearsDayActual.Text = "";
            txtLeaveDay.Text = "";
            pnlValidate.Visible = false;

            // load lưới chi tiết phiếu nghỉ
            LoadDetailGrid();

            // load lưới danh sách nghỉ
            LoadLeaveListGrid();
        }

        /// <summary>
        /// sự kiện click nút gửi duyệt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnApply_Click(object sender, EventArgs e)
        {
            try
            {
                long AppID = 0;
                long.TryParse(hApplicationLeaveID.Value.ToString(), out AppID);
                TS_LeaveRecordCollection collection = new TS_LeaveRecordCollection();

                //btnSave_Click(null, null);

                if (AppID > 0)
                {
                    long[] arr_ID = new long[1];
                    arr_ID[0] = AppID;
                    if (arr_ID.Length > 0)
                    {
                        collection.UpdateProcessByList(arr_ID, _SUBMIT);

                        // thông báo gửi duyệt thành công
                        MessageBox.ShowByMessCode("10182", MessageType.Successful);

                        setEnabledButton(false);
                    }

                    #region Xử lý trong K2
                    //K2Collection colK2 = new K2Collection();
                    //HR_WorkingRecordBL bl_wr = new HR_WorkingRecordBL();
                    //HR_WorkingRecordCollection cl_wr = new HR_WorkingRecordCollection();
                    //HIE_EmpInHierarchyCollection cl_emphie = new HIE_EmpInHierarchyCollection();
                    //SYS_MailTemplateCollection cl_mail = new SYS_MailTemplateCollection();
                    //bl_wr = cl_wr.SelectLastWRByEmpID(ucEmpHeader.EmployeeId);
                    //string sReportingLine = "";
                    //if (bl_wr.DTO != null)
                    //    sReportingLine = bl_wr.ReportingLine;

                    //string sFromDate = Convert.ToDateTime(dtpHideFromDate.SelectedDate).ToShortDateString();
                    //string sToDate = Convert.ToDateTime(dtpHideToDate.SelectedDate).ToShortDateString();
                    //string sRequester=SessionManager.UserDomain;

                    //#region Xử lý gửi mail cho requester
                    //string MailRequester_Subject = cl_mail.ReturnSubjectMail("TS_Creator");
                    //string MailRequester_Content = cl_mail.ReturnMailContent("TS_Creator");
                    //MailRequester_Content = MailRequester_Content.Replace("$FromDate$",sFromDate);
                    //MailRequester_Content = MailRequester_Content.Replace("$ToDate$", sToDate);
                    //MailRequester_Content = MailRequester_Content.Replace("$TotalDay$", hdfLeaveTaken.Value.Trim());
                    //MailRequester_Content = MailRequester_Content.Replace("$Approver$", sReportingLine);
                    //MailRequester_Content = MailRequester_Content.Replace("$url$", ConfigurationManager.AppSettings.Get("LinkLeaveList"));

                    //string EmailRequester = cl_mail.ReturnEmail(SessionManager.UserDomain);
                    //#endregion

                    //#region Xử lý gửi email cho Admin
                    //string MailAdmin_Subject = cl_mail.ReturnSubjectMail("TS_CreatorForAdmin");
                    //string MailAdmin_Content = cl_mail.ReturnMailContent("TS_CreatorForAdmin");
                    //long hierarchy = cl_emphie.SelectDeptHie(bl_wr.HierarchyId);
                    //HR.Business.HIE_HierarchyCollection cl_hie = new HR.Business.HIE_HierarchyCollection();
                    //HR.Business.HIE_HierarchyBL bl_hie = new HR.Business.HIE_HierarchyBL();
                    //bl_hie = cl_hie.SelectByID(hierarchy);
                    //if (bl_hie.DTO != null)
                    //{
                    //    MailAdmin_Subject = MailAdmin_Subject.Replace("$Dept$",bl_hie.NameVN);
                    //}

                    //MailAdmin_Subject = MailAdmin_Subject.Replace("$AccountDomain$",SessionManager.UserDomain);
                    //MailAdmin_Content = MailAdmin_Content.Replace("$EmpCode$",ucEmpHeader.EmpCode);
                    //MailAdmin_Content = MailAdmin_Content.Replace("$FullName$",ucEmpHeader.FullName);
                    //MailAdmin_Content = MailAdmin_Content.Replace("$FromDate$",sFromDate);
                    //MailAdmin_Content = MailAdmin_Content.Replace("$ToDate$", sToDate);
                    //MailAdmin_Content = MailAdmin_Content.Replace("$TotalDay$", hdfLeaveTaken.Value);
                    

                    //LS_WorkPointDTO bl_wp = new LS_WorkPointDTO();
                    //LS_WorkPointCollection cl_wp = new LS_WorkPointCollection();
                    //bl_wp = cl_wp.GetbyId(Convert.ToInt64(txtWorkPoint.Text.Trim()));
                    //if(bl_wp!=null)
                    //    MailAdmin_Content = MailAdmin_Content.Replace("$LeaveType$", bl_wp.NameVN);

                    //string sEmailAdmin = cl_mail.ReturnEmail(colK2.GetUserOfCB());
                    //#endregion

                    //#region Xử lý gửi mail Next Approver
                    //string sMailNextApprover_Subject = cl_mail.ReturnSubjectMail("TS_NextApprover");
                    //string sMailNextApprover_Content = cl_mail.ReturnMailContent("TS_NextApprover");
                    ////Gán thông tin vào Subject
                    //sMailNextApprover_Subject = sMailNextApprover_Subject.Replace("$Creator$",SessionManager.UserDomain);
                    ////Gán thông tin vào content
                    //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$Creator$", SessionManager.UserDomain);
                    //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$FromDate$",sFromDate);
                    //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$ToDate$", sToDate);
                    //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$TotalDay$", hdfLeaveTaken.Value);
                    //sMailNextApprover_Content = sMailNextApprover_Content.Replace("$url$", ConfigurationManager.AppSettings.Get("LinkLeaveApprove_Old"));

                    //string sMailReportingLine = cl_mail.ReturnEmail(sReportingLine);
                    //#endregion

                    //if (!string.IsNullOrEmpty(sReportingLine))
                    //{
                    //    int proid = K2CoreLib.K2Utils.StartLeaveRequestProcess(ucEmpHeader.EmployeeId.ToString(), sReportingLine, float.Parse(hdfLeaveTaken.Value.Trim()) < 0 ? 0 : float.Parse(hdfLeaveTaken.Value.Trim()), dtgList.Items[0]["LeaveRecordID"].Text.Trim(), AppID.ToString(), MailRequester_Subject, MailRequester_Content, EmailRequester
                    //                                                           ,MailAdmin_Subject,MailAdmin_Content,sEmailAdmin,sMailNextApprover_Subject,sMailNextApprover_Content,sMailReportingLine,sRequester,sFromDate,sToDate);

                    //    int iTypeID = K2CoreLib.K2Utils.GetTypeIDProcessFromEfrom("HR_LeaveRequest");
                    //    string sLinkContent = ConfigurationManager.AppSettings.Get("History_LeaveRequest") + AppID.ToString() + "&LeaveRecordID=" + dtgList.Items[0]["LeaveRecordID"].Text.Trim() + "&EmpID=" + ucEmpHeader.EmployeeId.ToString();
                    //    string sLinkFlow = proid.ToString();
                    //    string status = "0"; //(0: In process, 1: Complete, 2: Rework, 3:Reject)
                    //    string eformid = K2CoreLib.K2Utils.submit2EForm(SessionManager.UserDomain, SessionManager.UserDomain, iTypeID, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), sLinkContent, sLinkFlow, status, proid);

                    //    collection.UpdateProcessId(AppID,eformid);
                    //    #region begin to save history
                    //    cl_wr.InsertHistory(Convert.ToInt64(AppID.ToString()), DateTime.Now, SessionManager.Username, "Requester", "Submitted", "", 4);
                    //    #endregion End save
                    //}
                    #endregion
                }

            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        

        /// <summary>
        /// xử lý ajax - chọn thông tin đến ngày -> hiển thị thông tin ca làm việc trong khoảng thời gian từ ngày - đến ngày xuống lưới
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtpToDate_OnDateSelected(object sender, Telerik.Web.UI.Calendar.SelectedDateChangedEventArgs e)
        {
            try
            {
                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(this.hEmpID.Value, out lngEmpID);

                //lấy thông tin danh sách ca làm việc trong khoảng thời gian
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();
                DataTable dt = new DataTable();
                // ID phiếu nghỉ
                long lngLeaveID = 0;
                long.TryParse(hLeaveRecordID.Value.ToString(), out lngLeaveID);
                // ID loại nghỉ
                long lngWorkPointID = 0;
                long.TryParse(cboWorkPoint.SelectedValue, out lngWorkPointID);

                if (dtpToDate.SelectedDate == null && txtWorkPointTypeID.Text == "5") // đối với nhóm loại nghỉ sinh con
                    dtpToDate.SelectedDate = Convert.ToDateTime("01/01/2999");
                else if (dtpFromDate.SelectedDate == null || dtpToDate.SelectedDate == null) // 1 trong 2 thong tin = null thi ko lam j het
                    return;

                if (dtpFromDate.SelectedDate != null && dtpToDate.SelectedDate != null && Convert.ToDateTime(dtpFromDate.SelectedDate) <= Convert.ToDateTime(dtpToDate.SelectedDate))
                {
                    if (dtpFromDate.SelectedDate >= DateTime.Now.Date && dtpToDate.SelectedDate >= DateTime.Now.Date)
                        dt = col.SearchDetailScheduleEmp(lngEmpID, dtpFromDate.SelectedDate.Value, dtpToDate.SelectedDate.Value, lngLeaveID, hStatusEdit.Value.ToString(), lngWorkPointID);
                    else if (dtpFromDate.SelectedDate < DateTime.Now.Date || dtpToDate.SelectedDate < DateTime.Now.Date)
                        return;
                }

                // duyệt để tính số ngày làm việc theo lịch
                float sumCoef = 0;
                string WorkPointTypeCode = "";
                DateTime date = new DateTime();
                foreach (DataRow r in dt.Rows)
                {
                    sumCoef += float.Parse(r["NumDay"].ToString());
                    WorkPointTypeCode = r["WorkPointTypeCode"].ToString();
                    date = Convert.ToDateTime(r["ToDate"]);
                }
                txtLeaveTaken.Text = sumCoef.ToString(); // duyệt xong thì gán vào số ngày nghỉ

                // load thông tin đến ngày trong trường hợp nghỉ thai sản
                if (WorkPointTypeCode == "0001") // nhóm loại nghỉ sinh con
                    dtpToDate.SelectedDate = date;

                // load chi tiết phiếu nghỉ
                LoadDetailGrid();

                // khoảng thời gian ko có ca làm việc
                if (dtgDetail.Items.Count <= 0)
                    MessageBox.ShowByMessCode("10160", MessageType.Warning);
                else
                {
                    float SoNgayNghiNhap = TS_clsCommon.ConvertFromStringToFloat(txtLeaveTaken.Text);
                    float SoNgayNghiDB = TS_clsCommon.ConvertFromStringToFloat(txtLeaveTemp.Text);
                    float PhepCoTT = TS_clsCommon.ConvertFromStringToFloat(txtYearsDayActual.Text);

                    if (txtWorkPointTypeID.Text != "5")
                    {   // đối với nhóm nghỉ sinh con (thai sản) thì ko cần kiểm tra
                        if (SoNgayNghiNhap > PhepCoTT + SoNgayNghiDB && txtYearsDayActual.Text != "")
                            pnlValidate.Visible = true;
                        else
                            pnlValidate.Visible = false;

                        // thể hiện thêm thông tin còn lại sau khi đăng ký (add ngay 10/11/2011)                        
                        txtConLai.Text = (PhepCoTT + SoNgayNghiDB - SoNgayNghiNhap).ToString();
                    }
                    else pnlValidate.Visible = false;
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// xử lý ajax chọn loại nghỉ -> tính số ngày nghỉ còn lại và hiển thị phần lưu ý
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void cboWorkPoint_SelectedIndexChanged(object sender, Telerik.Web.UI.RadComboBoxSelectedIndexChangedEventArgs e)
        {
            try
            {
                // clear thông tin trước khi load lại
                txtRemainLeave.Text = string.Empty;

                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(this.hEmpID.Value, out lngEmpID);

                // ID loại nghỉ
                long lngWorkPointID = 0;
                long.TryParse(this.cboWorkPoint.SelectedValue, out lngWorkPointID);

                // lấy thông tin số ngày còn lại tương ứng của nhân viên và loại nghỉ
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();
                DataTable dt = new DataTable();
                dt = col.FindWorkPointByID_NewRule(lngWorkPointID, lngEmpID);

                if (dt != null && dt.Rows.Count > 0)
                {
                    DataRow r = dt.Rows[0];

                    // load số ngày còn lại, comment
                    if (r["LSWorkPointTypeID"].ToString() != "5")
                    { // đối với nhóm loại nghỉ thai sản thì ko thể hiện số ngày còn lại                    
                        txtRemainLeave.Text = r["YearDays"].ToString(); // còn lại                    
                        txtYearsDay.Text = r["SoPhepCo"].ToString(); // số phép có      
                        txtLeaveDay.Text = r["DaNghi"].ToString(); // đã nghỉ
                        txtYearsDayActual.Text = r["SoPhepTT"].ToString(); // số ngày được nghỉ thực tế
                        hdfLeaveTaken_K2.Value = r["SoPhepTT_K2"].ToString();
                        txtLeaveTemp.Text = "0";
                    }
                    else // thai sản
                    {
                        txtRemainLeave.Text = "";
                        txtYearsDay.Text = "";
                        txtLeaveDay.Text = r["DaNghi"].ToString(); // đã nghỉ
                        txtYearsDayActual.Text = r["SoPhepTT"].ToString(); // số ngày được nghỉ thực tế
                        hdfLeaveTaken_K2.Value = r["SoPhepTT_K2"].ToString();
                        txtLeaveTemp.Text = "0";
                    }

                    txtComment.Text = r["Note"].ToString();

                    if (Convert.ToBoolean(r["IsConfirm"].ToString())) // nếu là loại nghỉ có xác nhận thì hiển thị ghi chú
                        pnlComment.Visible = true;
                    else
                        pnlComment.Visible = false;

                    // lấy thông tin nhóm loại nghỉ tương ứng
                    txtWorkPointTypeID.Text = r["LSWorkPointTypeID"].ToString();

                    txtCLDays.Text = r["YearDays"].ToString();
                }

                // rem [19/09/2011]
                /*// lấy thông tin số ngày còn lại tương ứng của nhân viên và loại nghỉ
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();
                LS_WorkPointBL bl = new LS_WorkPointBL();
                bl = col.FindWorkPointByID(lngWorkPointID, lngEmpID);

                // load số ngày còn lại, comment
                if (bl.LSWorkPointTypeID != 5)
                { // đối với nhóm loại nghỉ thai sản thì ko thể hiện số ngày còn lại                    
                    txtRemainLeave.Text = bl.YearDays.ToString(); // còn lại                    
                }
                txtComment.Text = bl.Note;                

                if (bl.IsConfirm) // nếu là loại nghỉ có xác nhận thì hiển thị ghi chú
                    pnlComment.Visible = true;
                else
                    pnlComment.Visible = false; 
                
                // lấy thông tin nhóm loại nghỉ tương ứng
                txtWorkPointTypeID.Text = bl.LSWorkPointTypeID.ToString();

                txtCLDays.Text = bl.YearDays.ToString();*/

            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// Write dữ liệu cho lưới chi tiết phiếu nghỉ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgDetail_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
        {
            try
            {
                string IsHalfDay = "", IsHead = "", IsLast = "", IsAll = "";
                string IsHeadE = "", IsLastE = "", IsAllE = "";
                foreach (GridDataItem item in dtgDetail.Items)
                {
                    IsHalfDay = item["IsHalfDay"].Text.ToString();
                    IsHead = item["IsHead"].Text.ToString();
                    IsLast = item["IsLast"].Text.ToString();
                    IsAll = item["IsAll"].Text.ToString();
                    IsHeadE = item["IsHeadE"].Text.ToString();
                    IsLastE = item["IsLastE"].Text.ToString();
                    IsAllE = item["IsAllE"].Text.ToString();

                    CheckBox chkAll = (CheckBox)item.FindControl("chkAll");
                    CheckBox chkHead = (CheckBox)item.FindControl("chkHead");
                    CheckBox chkLast = (CheckBox)item.FindControl("chkLast");

                    // xử lý visible trong trường hợp ca 1/2 ngày hoặc 1 ngày có 2 loại nghỉ (đã nhập nửa buổi trong hệ thống)
                    if (IsHalfDay == "1") // ca 1/2 ngày
                    {
                        chkAll.Enabled = false;
                        chkLast.Enabled = false;
                        chkHead.Enabled = true;
                    }
                    else // ca nguyên ngày
                    {
                        chkAll.Enabled = true;
                        chkLast.Enabled = true;
                        chkHead.Enabled = true;
                    }
                    if (IsAllE == "1" || (IsHalfDay == "1" && IsHeadE == "1")) // ngày đã nhập nghỉ ở 1 phiếu nghỉ khác
                    {
                        chkAll.Enabled = false;
                        chkLast.Enabled = false;
                        chkHead.Enabled = false;
                    }
                    else if (IsHeadE == "1")
                    {
                        chkAll.Enabled = false;
                        chkLast.Enabled = true;
                        chkHead.Enabled = false;
                    }
                    else if (IsLastE == "1")
                    {
                        chkAll.Enabled = false;
                        chkLast.Enabled = false;
                        chkHead.Enabled = true;
                    }


                    // xử lý tự động check
                    if (IsHead == "1") chkHead.Checked = true;
                    if (IsLast == "1") chkLast.Checked = true;
                    if (IsAll == "1") chkAll.Checked = true;

                    // nếu là nghỉ thai sản thì ko cho hiệu chỉnh thông tin chi tiết phiếu nghỉ
                    if (txtWorkPointTypeID.Text == "5") // nhóm nghỉ sinh con
                    {
                        chkAll.Enabled = false;
                        chkLast.Enabled = false;
                        chkHead.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// edit thông tin phiếu nghỉ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgList_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "EditLeave")
                {
                    long lngLeaveRecordID = 0;
                    GridDataItem item = (GridDataItem)e.Item;
                    long.TryParse(item["LeaveRecordID"].Text, out lngLeaveRecordID);
                    hStatusEdit.Value = "1";
                    LoadInfoLeaveRecord(lngLeaveRecordID);
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// Sự kiện bind dữ liệu khi load Form cho dtgList
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgList_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
        {
            try
            {
                String isdeleted = "";
                if (e.Item is GridDataItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;

                    isdeleted = item["IsDeleted"].Text.ToString();
                    CheckBox check = (item["ClientSelectColumn"].Controls[0] as CheckBox);

                    // được xóa những dòng chưa có hiệu lực
                    if (isdeleted == "1")
                    {
                        check.Visible = true;
                    }
                    else
                    {
                        check.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }


        /// <summary>
        /// Load thông tin chi tiết phiếu nghỉ
        /// </summary>
        /// <param name="LeaveRecordID"></param>
        protected void LoadInfoLeaveRecord(long LeaveRecordID)
        {
            try
            {
                TS_LeaveRecordBL bl = new TS_LeaveRecordBL();
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();

                // lay thong tin chi tiet phieu nghi theo ID
                bl = col.FindLeaveRecordByID(LeaveRecordID);

                // thông tin loại nghỉ theo nhân viên
                long lngEmpID = 0;
                long.TryParse(hEmpID.Value, out lngEmpID);
                LS_WorkPointCollection col1 = new LS_WorkPointCollection();
                DataTable dtWorkPoint = new DataTable();
                dtWorkPoint = col1.GetComboWorkPointByEmpIDCheck(lngEmpID);

                if (bl.DTO != null)
                {
                    chkDetail.Checked = true;

                    for (int i = 0; i < dtWorkPoint.Rows.Count; i++)
                        if (dtWorkPoint.Rows[i]["Id"].ToString() == bl.LSWorkPointID.ToString())
                            this.cboWorkPoint.SelectedValue = bl.LSWorkPointID.ToString();

                    this.dtpFromDate.SelectedDate = bl.FromDate;
                    this.dtpToDate.SelectedDate = bl.ToDate;
                    this.txtLeaveTaken.Text = bl.LeaveTaken;
                    this.txtReason.Text = bl.Note;
                    this.txtComment.Text = bl.Comment;
                    this.hEmpID.Value = bl.EmpID.ToString();
                    this.hLeaveRecordID.Value = bl.LeaveRecordID.ToString();
                    this.hApplicationLeaveID.Value = bl.ApplicationLeaveID.ToString();

                    // thông tin số ngày còn lại
                    DataTable dt = col.GetUnUsedDays(bl.EmpID, bl.FromDate, bl.ToDate, bl.LSWorkPointID, LeaveRecordID);
                    DataRow r = dt.Rows[0];
                    txtRemainLeave.Text = r["UnUsedDays"].ToString(); // số ngày còn lại
                    txtWorkPointTypeID.Text = r["WorkPointTypeID"].ToString();
                    txtYearsDay.Text = r["PhepCo"].ToString(); // số ngày có
                    txtYearsDayActual.Text = r["PhepCoTT"].ToString(); // số ngày có thực tế
                    txtLeaveDay.Text = r["DaNghi"].ToString(); // số ngày đã nghỉ
                    txtLeaveTemp.Text = txtLeaveTaken.Text;

                    if (r["IsConfirm"].ToString() == "1")
                        pnlComment.Visible = true;
                    else
                        pnlComment.Visible = false;

                    // set trạng thái các button
                    if (bl.LeaveStatusID == 1 || bl.LeaveStatusID == 8) // trạng thái chưa gửi + từ chối
                        setEnabledButton(true);
                    else
                        setEnabledButton(false);

                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// load thông tin chi tiết phiếu nghỉ
        /// </summary>
        protected void LoadDetailGrid()
        {
            this.dataDetail.SelectParameters["FromDate"].DefaultValue = dtpFromDate.SelectedDate.ToString();
            this.dataDetail.SelectParameters["ToDate"].DefaultValue = dtpToDate.SelectedDate.ToString();
            this.dataDetail.SelectParameters["EmpID"].DefaultValue = hEmpID.Value;
            this.dataDetail.SelectParameters["LeaveRecordID"].DefaultValue = hLeaveRecordID.Value;
            this.dataDetail.SelectParameters["StatusEdit"].DefaultValue = hStatusEdit.Value;

            this.dtgDetail.DataSourceID = dataDetail.ID;
            this.dtgDetail.DataBind();
        }

        /// <summary>
        /// load thông tin danh sách phiếu nghỉ
        /// </summary>
        protected void LoadLeaveListGrid()
        {
            this.dataList.SelectParameters["ApplicationID"].DefaultValue = hApplicationLeaveID.Value;

            this.dtgList.DataSourceID = dataList.ID;
            this.dtgList.DataBind();
        }

        /// <summary>
        /// set trạng thái các button tương ứng với trạng thái của đơn nghỉ
        /// </summary>
        /// <param name="flag"></param>
        protected void setEnabledButton(Boolean flag)
        {
            btnSubmitTop.Enabled = flag;
            btnSubmitBot.Enabled = flag;
            btnAddNew.Enabled = flag;
            btnSave.Enabled = flag;
            btnDelete.Enabled = flag;

            btnSaveSubmitTop.Enabled = flag;
            btnSaveSubmitBot.Enabled = flag;
        }
    }
}